﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using hercules.Models.Dados;

namespace hercules.Models.Negocio
{
    /// <summary>
    /// Classe responsável pela lógica de negócio dos produtos.
    /// </summary>
    public class NegocioProduto 
    {
        private readonly IRepositorioGenerico<Produto, ControleEstoqueEntities> repositorioProduto;

        /// <summary>
        /// Construtor para inicializar os atributos.
        /// </summary>
        public NegocioProduto()
        {
            repositorioProduto = new RepositorioGenerico<Produto, ControleEstoqueEntities>("chave");
        }

        /// <summary>
        /// Método para fazer a inserção de produto.
        /// </summary>
        /// <param name="produto">Objeto que irá ser persistido</param>
        /// <returns>True e a inserção foi concluida com sucesso, caso contrário false</returns>
        public bool Inserir(Produto produto)
        {
            repositorioProduto.Inserir(produto);
            return repositorioProduto.SaveChanges() > 0;
        }


        /// <summary>
        /// Método para fazer a alteração de produto.
        /// </summary>
        /// <param name="produto">Objeto que terá seus dados alterados</param>
        /// <returns>True e a inserção foi concluida com sucesso, caso contrário false</returns>
        public bool Editar(Produto produto)
        {
            Produto _produto = Obter(produto.idProduto);
            _produto.nome = produto.nome;
            _produto.codigoBarra = produto.codigoBarra;
            _produto.dataVencimento = produto.dataVencimento;
            _produto.descontoMaximo = produto.descontoMaximo;
            _produto.apelido = produto.apelido;
            _produto.icms = produto.icms;
            _produto.ipi = produto.ipi;
            _produto.lote = produto.lote;
            _produto.naturezaCFOP = produto.naturezaCFOP;
            _produto.ncm = produto.ncm;
            _produto.precoNota = produto.precoNota;
            _produto.precoReal = produto.precoReal;
            _produto.precoVenda = produto.precoVenda;
            _produto.unidade = produto.unidade;

            //repositorioProduto.Attach(produto);

            return repositorioProduto.SaveChanges() > 0;
        }

        /// <summary>
        /// Método para remover um produto utilizando o código do produto.
        /// </summary>
        /// <param name="codProduto">Código do produto que será removido.</param>
        /// <returns>True e a inserção foi concluida com sucesso, caso contrário false</returns>
        public bool Remover(Int32 codProduto)
        {
            repositorioProduto.Remover(produto => produto.idProduto == codProduto);
            return repositorioProduto.SaveChanges() > 0;
        }

        /// <summary>
        /// Método que retorna uma lista com todos os produtos.
        /// </summary>
        /// <returns>A lista com os produtos.</returns>
        public List<Produto> ObterTodos()
        {
            return repositorioProduto.ObterTodos().ToList();
        }

        /// <summary>
        /// Método que retorna um produto passando o código desse produto.
        /// </summary>
        /// <param name="codProduto">Código do produto a ser retornado.</param>
        /// <returns>O produto desejado.</returns>
        public Produto Obter(int codProduto)
        {
            return repositorioProduto.ObterEntidade(produto => produto.idProduto == codProduto);
        }

        /// <summary>
        /// Método para fazer a comparação entre dois produtos.
        /// </summary>
        /// <param name="produto1">Primeiro produto.</param>
        /// <param name="produto2">Segundo produto.</param>
        /// <returns>True se eles forem iguais, caso contrário false.</returns>
        public bool Equals(Produto produto1, Produto produto2)
        {
            if (produto1.idProduto.Equals(produto2.idProduto) &&
                produto1.codigoBarra.Equals(produto2.codigoBarra) &&
                produto1.naturezaCFOP.Equals(produto2.naturezaCFOP) &&
                produto1.nome.Equals(produto2.nome) &&
                produto1.apelido.Equals(produto2.apelido) &&
                produto1.ncm.Equals(produto2.ncm) &&
                produto1.precoNota.Equals(produto2.precoNota) &&
                produto1.precoReal.Equals(produto2.precoReal) &&
                produto1.ipi.Equals(produto2.ipi) &&
                produto1.unidade.Equals(produto2.unidade) &&
                produto1.icms.Equals(produto2.icms) &&
                produto1.precoVenda.Equals(produto2.precoVenda) &&
                produto1.descontoMaximo.Equals(produto2.descontoMaximo) &&
                produto1.dataVencimento.Equals(produto2.dataVencimento) &&
                produto1.lote.Equals(produto2.lote) )
            {
                return true;
            }

            return false;
        }
    }
}